Concurrencia no Planeta Vermelho é a arte de gerenciar múltiplas operações independentes — como navegação de rover, telemetria de sinais vitais e conexões com satélites — sem que o sistema pare. Em Go, uma tarefa executada de forma independente é conhecida como um goroutine.
1. O Princípio da Não Determinação
É melhor sempre assumir que as operações em diferentes goroutines podem ser executadas em qualquer ordem. Como o tempo de execução do Go agenda tarefas em núcleos disponíveis, não podemos confiar em um rover terminar sua varredura antes que outro comece sua transmissão sem sincronização explícita.
2. Mecanismos de Sincronização
Para gerenciar essas tarefas, o Go fornece duas ferramentas principais:
- Exclusão Mútua: As goroutines podem usar um
mutexpara excluir mutuamente a realização de alguma coisa ao mesmo tempo. - A Declaração Select: Esta parece uma instrução switch onde cada caso contém uma recepção ou envio de canal.
selectespera até que um caso esteja pronto e depois o executa.
3. O Esqueleto do Trabalhador
Trabalhadores de longa duração normalmente utilizam um loop infinito combinado com select para monitorar múltiplos canais de comunicação simultaneamente:
for {
select {
// Espere pelos canais aqui.
}
}
}